home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1995-11-25 | 18.1 KB | 419 lines |
- (******************************************************************************)
- (* This MODULE is Public Domain. Copy me like a beast! *)
- (* Christian Ledermann *)
- (* Wölfelkofen 2 *)
- (* 84166 Adlkofen *)
- (******************************************************************************)
- (* *)
- (* Started: 20.12.92 03:54:30 *)
- (* Version: 20.12.89 00:404:12:54 *)
- (* *)
- (******************************************************************************)
- (* *)
- (* Diese Software ist ohne jede Garantie. Ich verspreche *)
- (* keinerlei Wartung und übernehme keine Verantwortung für Schäden die *)
- (* durch die Benutzung dieses Programmes entstehen. *)
- (* Jegliche Ersatzansprüche lehne ich ab. *)
- (* *)
- (******************************************************************************)
- DEFINITION MODULE EasyWindow;
-
- (* NeuImplementation und Anpassung von : *)
- (* MODULE WindowBase; *) (* Hans Endl 25. 09. 1986 *)
- (* 02. 06. 1987 *)
- (* 01. 10. 1987 *)
-
-
- (**************************************************************************)
- (* Mit der Einführung von WinX und MultiGEM stehen nun mehr als 8 Fenster *)
- (* unter GEM zur Verfügung. *)
- (* Die Tricksereien mit Aktivate und Deaktivate zur Verwaltung von 12 *)
- (* Fenstern sind also hinfällig geworden. *)
- (* Zudem sind hier nun auch die Interna des Modules zugänglich. *)
- (* BugFixes und Verbesserungen lassen sich also ohne weiteres vornehmen. *)
- (**************************************************************************)
-
-
- FROM SYSTEM IMPORT ADDRESS,BYTE;
- FROM GEMVDIbase IMPORT PxyArrayType;
-
-
- (* Dieses Modul stellt eine Zwischenschicht zur Fensterprogrammierung
- zur Verfügung, die etwas komfortablere Funktionen als die reinen
- AES-Aufrufe enthält, aber nicht so sehr einschränkt wie die auf
- MEDOS basierenden Moduln "Windows", "TextWindows" und "Graphic-
- "Windows".
-
- Wichtige Bestandteile von "WindowBase" sind
-
- - die Struktur "windowtype", die die unter AES am häufigsten
- benötigten Fensterdaten enthält
-
- - Prozeduren zum Setzen der Schieber
-
- - die automatische Abarbeitung der Rechteckliste bei Redraw-
- Aufrufen
- *)
-
- CONST
-
- (* ehemals : *)
- (* maxwindow = 12; (* 7 Fenster in GEM-AES möglich + 5 für Debugger *) *)
- (* *)
-
- (*neu*) maxwindow = 127; (* geändert für WinX und MultiTOS ... *)
- deskhandle = 0;
- (*neu*)
- (* Window-Arrowed Ergebnisse *)
- WindowUpPage=0;
- WindowDownPage=1;
- WindowUpLine=2;
- WindowDownLine=3;
- WindowLeftPage=4;
- WindowRightPage=5;
- WindowLeftLine=6;
- WindowRightLine=7;
- (* eigentlich sollten diese ereignisse in GEMAESBase definiert sein *)
-
-
- TYPE
- window = INTEGER;
-
- (* Aus Gründen der Kompatibilität zu AES und MEDOS wird zur Iden-
- tifikation eines Fensters nicht ein Zeiger auf den unten defi-
- nierten Window-Record benutzt, sondern eine Integer-Zahl, die
- mit dem AES-Window-Handle identisch ist und als Index eines
- Feldes von ((*neu*)POINTER TO) Window-Records fungiert.
- *)
-
-
- rectangle = RECORD
- x: INTEGER; (* x-Koordinate der linken oberen Ecke *)
- y: INTEGER; (* y-Koordinate der linken oberen Ecke *)
- w: INTEGER; (* Breite *)
- h: INTEGER (* Höhe *)
- END;
-
- (* Definition eines Rechtecks in AES-spezifischer Form mit linker
- oberer Ecke und Breite und Höhe in Pixeln, im Gegensatz zu der
- vom VDI meist benutzten Form des PxyArrays, das durch zwei dia-
- gonal gegenüberliegende Ecken definiert wird.
- *)
-
- WindowElement = (Title, CloseButton, FullButton, Moveable,
- InfoLine, SizeButton, UpArrow, DownArrow,
- VertSlider, LeftArrow, RightArrow, HorizSlider);
-
- WindowElements = SET OF WindowElement;
-
- (*neu*) Effects = (Bold,Light,Italic,Underlined,Outlined,Shaded);
- (*neu*) TextEffects = SET OF Effects;
-
- CONST
- AllElements = WindowElements {Title..HorizSlider};
- NoElements = WindowElements{};
- (*neu*) NoEffects = TextEffects{};
-
- TYPE
- wstring = ARRAY [0..79] OF CHAR; (* String für Titel und Info *)
- RedrawProcType = PROCEDURE (window, rectangle);
-
-
- windowtype = RECORD
- handle: INTEGER; (* AES-Fensternummer *)
- max: rectangle; (* Maximale Fenstergröße *)
- total: rectangle; (* Aussenmasse des Fensters *)
- work: rectangle; (* Innenmasse des Fensters *)
- (*neu*) min: rectangle; (* Minimale Fenstergröße *)
- elements: WindowElements; (* Menge der Fensterelemente*)
- fulled: BOOLEAN; (* Fenster auf max gesetzt *)
- opened: BOOLEAN; (* Fenster geöffnet *)
- ontop: BOOLEAN; (* TRUE, falls oberstes F. *)
- text: BOOLEAN; (* TRUE, falls Textfenster *)
- (*neu*) grow: BOOLEAN; (* Wenn diese Variable auf TRUE gesetzt ist,
- wächst bzw. schrumpft das Fenster beim
- Öffnen bzw. Schliessen *)
- (*neu*) snap: BOOLEAN; (* Fenster Snappen *)
- (*neu*) allignX,
- (*neu*) allignY : INTEGER; (* horizontale /vertikale Ausrichtung *)
- (*neu*) scrollX,
- (*neu*) scrollY : INTEGER; (* Scrollwert : um diesen Betrag wird
- der Fensterinhalt bei Betätigen der
- Schieber gerollt *)
- row, col: INTEGER; (* Zeile und Spalte bei Text Pixel bei Grafik *)
- maxrow: INTEGER; (* letzte Zeile *)
- maxcol: INTEGER; (* letzte Spalte *)
- colour: INTEGER; (* Hintergrundfarbe *)
- CASE :BOOLEAN OF
- TRUE:
- style: INTEGER; (* Fülltyp für Hintergrund *)
- |FALSE:
- (*neu*) InteriorStyle : BYTE;
- (*neu*) FillStyle : BYTE; (* so ist es einfacher den Fülltyp einzustellen*)
- END(*CASE*);
- textcolour: INTEGER; (* Farbe des Textes *)
- (*neu*) texteffects:TextEffects; (* Text-Effekte *)
- redrawproc: RedrawProcType; (* Redraw-Procedure *)
- title: wstring; (* Titelzeile *)
- info: wstring; (* Informationszeile *)
- reference: ADDRESS; (* frei für Anwender *)
- END;
-
-
-
-
-
- TYPE
- windowptr = POINTER TO windowtype;
-
-
- VAR
- (*neu*) windowlist: ARRAY [-1..maxwindow] OF windowptr;
-
- (* In WindowBase war es noch :
-
- windowlist: ARRAY [0..maxwindow] OF windowtype;
-
- aber mit der größeren Anzahl von Fenstern ist es günstiger
- hier ein speicherplatzsparenderes ARRAY zu benutzen.
- Nicht vorhandene ( mit createWindow erzeugte )Fenster belegen hier
- nur den Speicherplatz eines POINTERs (4 BYTE) und nicht den
- eines ganzen WindowTypes *)
- (* Default Werte *)
-
- growbox: BOOLEAN; (* Wenn diese Variable auf TRUE gesetzt ist,
- wachsen bzw. schrumpfen die Fenster beim
- Öffnen bzw. Schliessen, default = TRUE *)
-
- (*neu*) Snap: BOOLEAN; (* Fenster Snappen Ja/Nein,default = FALSE *)
-
- (*neu*) AllignX,
- (*neu*) AllignY : INTEGER; (* horizontale /vertikale Ausrichtung
- Default = 1/1 *)
-
-
-
- (*neu*) PROCEDURE TerminateWindows;(* Alle Fenster schließen (AES.CloseWindow),
- ihre handles freigeben (AES.DeleteWindow)
- und den Speicherplatz für die MODULE-interne
- Verwaltung freigeben (STORAGE.DEALLOCATE).
- !!!!! ACHTUNG !!!!!!
- Unbedingt vor Verlassen des Programmes
- aufrufen !! *)
-
-
- PROCEDURE createWindow (VAR u: window;
- x, y, w, h: INTEGER;
- parts: WindowElements;
- title: ARRAY OF CHAR;
- textwindow: BOOLEAN;
- rdp: RedrawProcType);
-
- (* Erzeugt die im AES und in diesem Modul notwendigen Datenstrukturen
- zur Verwaltung eines Fensters, das jedoch noch nicht gezeichnet
- wird.
-
- x, y, w und h beschreiben die maximale Grösse des äusseren Fenster-
- randes. Sind w und h gleich 0, so wird die Grösse des Desktops
- ohne Menüleiste übernommen.
-
- "parts" ist ein Set aus den gewünschten Fensterelementen.
-
- "title" ist der Fenstertitel.
-
- "textwindow" soll bei Textfenstern auf TRUE gesetzt werden,
- der Fensterursprung wird dann an das Textraster angepaßt.
-
- "rdp" ist die Redraw-Prozedur, also die Prozedur, die den Inhalt
- des Fensters zeichnet. Sie wird beim Aufruf der Prozedur "DoRedraw"
- (siehe unten) so oft aufgerufen wird, bis die Rechteckliste, die
- die sichtbaren Teile des Fensters angibt, abgearbeitet worden ist.
- An "rdp" wird beim Aufruf ein Rechteck übergeben, das die neu
- zu zeichnende Fläche angibt. Wurde beim Aufruf von "DoRedraw"
- der Paramter "clip" auf FALSE gesetzt, muss "rdp" alle Ausgaben
- selbst auf diese Fläche begrenzen, was die Ausgabe vor allem bei
- Text stark beschleunigen kann, aber bei teilweise verdeckten Fen-
- stern kaum durchführbar ist. Beim Zeichnen von Objektbäumen wird
- das Begrenzungsrechteck direkt beim "ObjectDraw"-Aufruf angegeben.
- *)
-
- (*neu*)
- (* ersatzlos getrichen : *)
- (* PROCEDURE activate (u: window); *)
- (* PROCEDURE deactivate (u: window); *)
- (* wird nicht mehr benötigt da nun genügend Fenster zur Verfügung stehen *)
-
-
- PROCEDURE clearWindow (u: window );
-
- PROCEDURE closeWindow (u: window );
-
- PROCEDURE deleteWindow (VAR u: window );
- (* window wird auf -1 gesetzt! *)
-
- PROCEDURE fullWindow (u: window );
-
- PROCEDURE openWindow (u: window ; x, y, w, h: INTEGER);
- (* falls x,y,w,h =0 wird die vorige Grösse des
- Fensters wiederhergestellt *)
- PROCEDURE setWindow (u: window ; x, y, w, h: INTEGER);
-
- PROCEDURE topWindow (u: window);
-
- PROCEDURE MouseOn;
-
- PROCEDURE MouseOff;
-
- (* Vor Ausgaben auf den Bildschirm muss die Maus ausgeschaltet werden,
- da sonst das Maussymbol überschrieben wird und bei der nächsten
- Bewegung der Maus der alte, zuvor von der Maus verdeckte Bildschirm-
- inhalt wieder restauriert wird. Alle Prozeduren in diesem Modul, die
- den Bildschirm verändern, schalten die Maus während der Ausgabe aus.
- Während des Aufrufs der vom Benutzer bereitgestellten Redraw-Prozedur
- beim Abarbeiten der Rechteckliste in "DoRedraw" wird die Maus eben-
- falls ausgeschaltet, ruft der Benutzer dagegen selbst seine Redraw-
- Prozedur auf oder benutzt er die weiter unten beschriebenen Textaus-
- gabeprozeduren, muss er sich selbst um die Maus kümmern.
-
- Achtung: Ein- und Ausschalten der Maus wird vom Betriebssystem
- mitgezählt. Wird die Maus mehrmals ausgeschaltet, muß
- sie genausooft wieder eingeschaltet werden, damit sie
- sichtbar wird. Wird die Maus zu oft eingeschaltet, dann
- entstehen beim Bewegen von Fenstern und Schiebern Schmutz-
- effekte.
- *)
-
-
- PROCEDURE SetHorSlider (u: window ; wpos, wsize, total: INTEGER);
-
- (* siehe "SetVertSlider", setzt den horizontalen Schieber entsprechend
- der horizontalen Position des Fensters im Gesamtdokument.
- *)
-
- PROCEDURE SetInfo (u: window ; s: ARRAY OF CHAR);
-
- (* Schreibt einen Text in die Info-Zeile des Fensters *)
-
- PROCEDURE SetTitle (u: window ; s:ARRAY OF CHAR);
-
- (* Schreibt einen Text in die Titel-Zeile des Fensters. Der Text
- bleibt beim Schliessen erhalten und wird beim Öffnen wieder
- angezeigt
- *)
-
- PROCEDURE SetVertSlider (u: window ; wpos, wsize, total: INTEGER);
-
- (* Berechnet die korrekte Position und -grösse des vertikalen
- Schiebers aus den Parametern, die die vertikale Position des
- Fensters im Gesamtdokument beschreiben, und setzt den Schieber.
- Die Schieber müssen, falls vorhanden, nach jeder Veränderung
- der Fenstergrösse oder des Fensterinhalts neu gesetzt werden.
-
- Bedeutung der Parameter:
-
- wpos: Anfangsposition des Fensters im Gesamtdokument
- wsize: Grösse des im Fenster dargestellten Teils des Gesamtdokuments
- total: Grösse des Gesamtdokuments
- *)
-
- PROCEDURE clearrect (u: window ; rect: rectangle);
-
- (* Löscht einen Rechteckbereich innerhalb des Fensters "u" in
- Fensterkoordinaten *)
-
-
- PROCEDURE copyrect (u: window ; source, dest: rectangle);
-
- (* Kopiert innerhalb eines Fensters den Rechteckbereich "source" in
- den Rechteckbereich "dest" (Koordinaten relativ zum Fensterursprung
- links oben). Der freiwerdende Bereich von "source" muss bei Bedarf
- gelöscht werden. Mit dieser Prozedur lassen sich Scroll-,
- Insert- und Deletefunktionen in Textfenstern realisieren *)
- (* Achtung ! Dies funktioniert nur bei Fenstern die nicht verdeckt
- liegen. Vor Aufruf dieser Routine sollte überprüft werden ob
- das Fenster das TopWindow ist *)
- PROCEDURE scrollup (u: window );
-
- (* Schiebt den Inhalt eines Textfensters eine Zeile nach oben, die
- oberste Zeile verschwindet, die unterste wird gelöscht. "row"
- wird auf "maxrow", "col" auf 0 gesetzt *)
- (* Benutzt copyrect => überprüfen ob Fenster ontop ist *)
-
- PROCEDURE scrolldown (u: window );
-
- (* Schiebt den Inhalt eines Textfenster eine Zeile nach unten, die
- unterste Zeile verschwindet, die oberste wird gelöscht. "row"
- und "col" werden auf 0 gesetzt *)
- (* Benutzt copyrect => überprüfen ob Fenster ontop ist *)
-
-
- PROCEDURE DrawCursor (u: window ; row, col: INTEGER);
-
- (* Zeichnet ein Rechteck in der Grösse eines Zeichenfeldes an die
- angegebene Stelle innerhalb des Fensters. Da alle Pixel inver-
- tiert werden, nimmt ein zweiter Aufruf mit denselben Parametern
- den Cursor wieder weg. *)
- (* noch nicht implementiert *)
-
-
- PROCEDURE WriteStr (u: window ; row, col: INTEGER; s: ARRAY OF CHAR);
-
- (* Gibt einen String ab der durch "row" (Zeile) und "col" (Spalte)
- angegebenen Stelle aus. Zeile und Spalte beziehen sich auf den
- Arbeitsbereich des Fensters. Das Zeichen in der linken oberen
- Ecke hat die Koordinaten (0,0). *)
- (* noch nicht implementiert *)
-
-
- PROCEDURE WriteTextBlock (u: window ; row, col: INTEGER;
- adr: ADDRESS; count: INTEGER);
-
- (* Wie "WriteStr", nur wird der auszugebende String durch die Adresse
- des ersten Zeichens und die Länge angegeben
- *)
- (* noch nicht implementiert *)
-
- PROCEDURE WriteTextBuffer (u: window ; adr: ADDRESS;
- count, offset: INTEGER);
-
- (* Gibt den ab der Adresse "adr" liegenden Text ins Fenster "u" ab
- der Position (0,0) aus, bis entweder 0C im Text auftritt, "count"
- erreicht wird oder das Fenster voll ist. Als Zeilenende wird lf
- erkannt, cr wird ignoriert. Falls "offset" > 0, werden die ersten
- "offset" Zeichen in jeder Zeile übersprungen, so dass sich hori-
- zontale Fensterverschiebungen realisieren lassen. Diese Prozedur
- eignet sich gut für das Redrawing von Textfensterpuffern.
- *)
- (* noch nicht implementiert *)
-
-
- PROCEDURE RectToPxy (VAR rect: rectangle; VAR pxy: PxyArrayType);
-
- (* Wandelt die Koordinaten eines Rechtecks von der "rectangle"-Form
- "PxyArray"-Form um (siehe obige Definition)
- *)
-
-
- PROCEDURE DoRedraw (u: window ; x, y, w, h: INTEGER; clip: BOOLEAN);
-
- (* Holt sich von AES die Rechteckliste des Fensters w, schneidet die
- erhaltenen Rechtecke mit dem Desktop und der als Parameter über-
- gebenen Fläche und führt dann die erforderliche Anzahl von Auf-
- rufen der Redraw-Prozedur, die beim Create-Aufruf angegeben wurde,
- aus. "DoRedraw" ist somit die Aktion auf eine Redraw-Message. Mit
- "clip" kann angegeben werden, ob "DoRedraw" selbst den Clipping-
- Aufruf für VDI-Funktionen durchführen soll. In jedem Fall wird
- während des Ablaufs von "DoRedraw" das Window-Update-Flag gesetzt
- und die Maus ausgeschaltet.
- *)
-
- (*neu*)
- (* ersatzlos getrichen : *)
- (* PROCEDURE wd (handle: INTEGER): window; *)
- (* wird nicht mehr benötigt da nun genügend Fenster zur Verfügung stehen *)
-
- PROCEDURE wp (u: window): windowptr;
-
-
- END EasyWindow.
-